//
//  SocketViewController.m
//  DebugDemo
//
//  Created by XFB on 2019/8/1.
//  Copyright © 2019 ZhouCheng. All rights reserved.
//

#import "SocketViewController.h"
//#import <sys/socket.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#import <sys/types.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>


@interface SocketViewController ()

@property (weak, nonatomic) IBOutlet UITextField *textFiled;
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (nonatomic, assign) int clientSocket;

@end

@implementation SocketViewController

- (void)viewDidLayoutSubviews
{
    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationItem.title = self.titleString;
}

- (IBAction)sendButtonDidClick:(UIButton *)sender
{
    if ([_textFiled.text isEqualToString:@""]) {
        NSLog(@"发送消息不能为空");
        return;
    }
    [self sendMessage:_textFiled.text];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self initSocket];
}

- (void)initSocket {
    
    /**
     1、创建 Socket
     第一个参数：address_family, 协议簇 AF_INET ---> IPV4
     第二个参数：数据格式 ---> SOCK_STREAM(TCP) / SOCK_DGRAM(UDP)
     第三个参数：protocol IPPROTO 如果传入 0 会自动根据第二个参数，选中合适的协议
     返回值：成功 ---> 正值 失败 ---> -1
     */
    _clientSocket = socket(AF_INET, SOCK_STREAM, 0);

    if (_clientSocket == -1) {
        NSLog(@"socket error : %d", _clientSocket);
        return;
    }
    
    /**
     2、连接
     第一个参数：客户端 Socket
     第二个参数：指向数据结构， sockeAddr 的指针，其中包括目的端口 和 IP地址
     第三个参数：结构体数据长度
     返回值：成功 ---> 0 其他 ---> 错误代号
     */
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_len = sizeof(sockAddr);
    /// 端口
    sockAddr.sin_port = htons(12345);
    /// 地址
    sockAddr.sin_addr.s_addr = inet_addr("192.168.0.116");

    int flag = connect(_clientSocket, (const struct sockaddr *)&sockAddr, sizeof(sockAddr));

    if (!flag) {
        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(receiveAction) object:nil];
        [thread start];
        NSLog(@"连接成功");
    } else {
        NSLog(@"连接错误");
        exit(EXIT_FAILURE);
    }
}

- (void)receiveAction
{
    while (1) {
        /**
         从服务器去接收数据
         
         第一个参数：客户端 Socket
         第二个参数：接收内容缓冲区域
         第三个参数：接收内容缓冲区长度
         第四个参数：接收方式、0表示阻塞，必须等服务器返回数据
         返回值：成功 ---> 返回读入字节数  失败 ---> SOCKET_ERROR
         */
        char recv_msg[1024];
        ssize_t recvLen = recv(_clientSocket, recv_msg, sizeof(recv_msg), 0);
        __block NSString *receiverString = [NSString stringWithFormat:@"收到数据：%s",recv_msg];

        dispatch_async(dispatch_get_main_queue(), ^{
            self.textView.text = receiverString;
        });

        printf("%s\n", recv_msg);
        NSLog(@"接收了%ld字节数据", recvLen);
        
        if (recvLen == 0) {
            break;
        }
    }
}

- (void)sendMessage:(NSString *)msg {
    const char *send_Message = [msg cStringUsingEncoding:NSUTF8StringEncoding];
    send(_clientSocket, send_Message, strlen(send_Message), 0);
    
    NSInteger sendlength = msg.length;
    self.textFiled.text = @"";
    
    NSLog(@"发送了%ld个字节的字符，内容是:%@",sendlength, msg);
}


@end
